﻿using System;
using System.Device.Location;
using System.Diagnostics;
using System.IO.IsolatedStorage;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;

namespace Coding4Fun.WheresMyCar
{
	public partial class App : Application
	{
		public const string GpsDeniedError = "Please enable Location on the phone";
        public const string NoNetworkError = "No network connection found.  Maps will not display.";
        public const string GpsLockMessage = "Attempting to lock GPS...\n(Requires {0} meter accuracy, currently {1} meters)";
        public const string NetworkFoundMessage = "A network connection has been re-established.";
        public const string LocAwareMessage = "Where's My Car needs GPS.  Your location data is only used to locate you on a map and get your routing data.";
        public const string ClearParkingPrompt = "Would you like to clear this parking space?";

		public GeoCoordinateWatcher GPS { get; set; }

		// Easy access to the root frame
		public PhoneApplicationFrame RootFrame { get; private set; }

		// Constructor
		public App()
		{
			// Global handler for uncaught exceptions. 
			UnhandledException += Application_UnhandledException;

			// Standard Silverlight initialization
			InitializeComponent();
            
            GPS = new GeoCoordinateWatcher(GeoPositionAccuracy.High) { MovementThreshold = 5 };

			// Phone-specific initialization
			InitializePhoneApplication();
		}

		// Code to execute when the application is launching (eg, from Start)
		// This code will not execute when the application is reactivated
		private void Application_Launching(object sender, LaunchingEventArgs e)
		{
            if (!IsolatedStorageSettings.ApplicationSettings.Contains("location"))
            {
                if (Debugger.IsAttached && Microsoft.Devices.Environment.DeviceType == Microsoft.Devices.DeviceType.Emulator)
                    IsolatedStorageSettings.ApplicationSettings.Add("location", new GeoCoordinate(44.58758, -123.25253));
                else
                    IsolatedStorageSettings.ApplicationSettings.Add("location", null);
            }

		    InitGPS();
		}

		private void InitGPS()
		{
            // IF permission has been granted for this app, but is currently disabled at the system level, it indicates "Granted"
            if (GPS.Permission != GeoPositionPermission.Denied && GPS.Status != GeoPositionStatus.Disabled)
			{
				if (!System.Diagnostics.Debugger.IsAttached)
					GPS.TryStart(false, TimeSpan.FromSeconds(10));
                else GPS.Start(false);
			}
			else
				MessageBox.Show(GpsDeniedError);
		}

		// Code to execute when the application is activated (brought to foreground)
		// This code will not execute when the application is first launched
		private void Application_Activated(object sender, ActivatedEventArgs e)
		{
			InitGPS();
			
		}

		// Code to execute when the application is deactivated (sent to background)
		// This code will not execute when the application is closing
		private void Application_Deactivated(object sender, DeactivatedEventArgs e)
		{
		}

		// Code to execute when the application is closing (eg, user hit Back)
		// This code will not execute when the application is deactivated
		private void Application_Closing(object sender, ClosingEventArgs e)
		{
		}

		// Code to execute if a navigation fails
		void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
		{
			if (System.Diagnostics.Debugger.IsAttached)
			{
				// A navigation has failed; break into the debugger
				System.Diagnostics.Debugger.Break();
			}
		}

		// Code to execute on Unhandled Exceptions
		private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
		{
			if (System.Diagnostics.Debugger.IsAttached)
			{
				// An unhandled exception has occurred; break into the debugger
				System.Diagnostics.Debugger.Break();
			}
			else
			{
				MessageBox.Show("Sorry, but there was a fatal error\n" + e.ExceptionObject.Message);
			}
		}

		#region Phone application initialization

		// Avoid double-initialization
		private bool phoneApplicationInitialized = false;

		// Do not add any additional code to this method
		private void InitializePhoneApplication()
		{
			if (phoneApplicationInitialized)
				return;

			// Create the frame but don't set it as RootVisual yet; this allows the splash
			// screen to remain active until the application is ready to render.
			RootFrame = new PhoneApplicationFrame();
			RootFrame.Navigated += CompleteInitializePhoneApplication;

			// Handle navigation failures
			RootFrame.NavigationFailed += RootFrame_NavigationFailed;

			// Ensure we don't initialize again
			phoneApplicationInitialized = true;
		}

		// Do not add any additional code to this method
		private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
		{
			// Set the root visual to allow the application to render
			if (RootVisual != RootFrame)
				RootVisual = RootFrame;

			// Remove this handler since it is no longer needed
			RootFrame.Navigated -= CompleteInitializePhoneApplication;
		}

		#endregion
	}
}
